package model

import (
	"fmt"
	"gitee.com/liumou_site/logger"
	"math/rand"
	"sync"
	"time"
)

func getRandomInt(min, max int) int {
	if min >= max {
		return min
	}
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	return r.Intn(max-min+1) + min // 注意：Into(n) 返回 [0, n) 范围的数，所以需要加 min
}
func (info *Info) Start() {
	// 启动内存监控
	if info.MemoryMon != nil {
		info.MemoryMon.Start()
		defer info.MemoryMon.Stop()
	}
	
	// 获取当前小时
	TimeNow := time.Now().Hour()
	if TimeNow >= info.TimeStart {
		logger.Info(fmt.Sprintf("当前时间[ %d ]大于设置的开始时间,开始下载...", TimeNow))
	} else {
		if info.Debug {
			logger.Debug(fmt.Sprintf("当前时间[ %d ]小于设置的开始时间,暂停下载...", TimeNow))
		}
		// 等待一分钟
		time.Sleep(time.Minute)
		return
	}
	if TimeNow >= info.TimeStop {
		if info.Debug {
			logger.Debug(fmt.Sprintf("当前时间[ %d ]大于或等于设置的停止时间,暂停下载...", TimeNow))
		}
		time.Sleep(time.Minute)
		return
	}
	info.ReadUrlFile() // 读取urls.txt
	if len(info.Urls) == 0 {
		info.Err = fmt.Errorf("无可用链接,请确认是否正确设置key参数或[ %s ]文件", info.UrlFile)
		logger.Error(info.Err)
		return
	}
	logger.Info("开始进入下载...")
	
	// 打印内存统计信息
	if info.Debug && info.MemoryMon != nil {
		stats := info.MemoryMon.GetMemoryStats()
		logger.Debug(fmt.Sprintf("内存统计 - 当前使用: %s, 峰值: %s, 池命中率: %d, 池未命中率: %d",
			formatBytes(stats["current_usage"].(int64)),
			formatBytes(stats["peak_usage"].(int64)),
			int64(stats["pool_hits"].(int64)),
			int64(stats["pool_misses"].(int64))))
	}
	
	// 使用协程
	wg := &sync.WaitGroup{}
	if info.Debug {
		logger.Debug("当前设置的线程数量为: ", info.ThreadNum)
	}
	// 设置协程数量
	for i := 1; i < info.ThreadNum+1; i++ {
		wg.Add(1)
		// 使用随机数获取URL
		var idRand int
		if info.UrlNum > 1 {
			idRand = getRandomInt(0, info.UrlNum-1)
		} else if info.UrlNum == 1 {
			idRand = 0
		} else {
			logger.Error("没有可用的URL")
			wg.Done()
			continue
		}
		if info.Debug {
			logger.Debug("随机数: ", idRand)
		}
		go info.DownloadUrl(info.Urls[idRand], wg, info.MaxSize)

	}
	wg.Wait()
	
	// 下载完成后打印最终内存统计
	if info.MemoryMon != nil {
		stats := info.MemoryMon.GetMemoryStats()
		logger.Info(fmt.Sprintf("下载完成 - 内存使用: %s, 峰值: %s, GC次数: %d",
			formatBytes(stats["current_usage"].(int64)),
			formatBytes(stats["peak_usage"].(int64)),
			int64(stats["num_gc"].(int64))))
	}
}
